from functools import wraps
from flask import request, jsonify
import jwt
from app.config import Config


def token_required(f):
    """
    JWT认证装饰器，用于保护需要认证的API接口
    
    Args:
        f: 需要保护的视图函数
    
    Returns:
        装饰后的函数
    """
    @wraps(f)
    def decorated(*args, **kwargs):
        token = None
        
        # 从请求头中获取token
        if 'Authorization' in request.headers:
            auth_header = request.headers['Authorization']
            if auth_header.startswith('Bearer '):
                token = auth_header.split(' ')[1]
        
        # 检查token是否存在
        if not token:
            return jsonify({
                'code': 401,
                'message': '认证失败，请重新登录',
                'data': None
            }), 401
        
        try:
            # 验证token
            data = jwt.decode(token, Config.SECRET_KEY, algorithms=['HS256'])
            # 将用户ID添加到请求上下文中
            request.current_user_id = data['user_id']
        except jwt.ExpiredSignatureError:
            return jsonify({
                'code': 401,
                'message': 'Token已过期',
                'data': None
            }), 401
        except jwt.InvalidTokenError:
            return jsonify({
                'code': 401,
                'message': 'Token无效',
                'data': None
            }), 401
        
        return f(*args, **kwargs)
    
    return decorated


def admin_required(f):
    """
    管理员权限装饰器，用于保护需要管理员权限的API接口
    
    Args:
        f: 需要保护的视图函数
    
    Returns:
        装饰后的函数
    """
    @wraps(f)
    @token_required  # 先验证登录
    def decorated(*args, **kwargs):
        # 这里可以添加管理员权限检查逻辑
        # 暂时只检查登录状态
        return f(*args, **kwargs)
    
    return decorated